import matplotlib.pyplot as plt
import numpy as np
import sympy as sp


def set_chinese_font():
    """设置中文字体"""
    plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']
    plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

set_chinese_font()

def sets_and_functions():
    print("=== 集合与函数 ===")
    
    # 集合运算
    A = {1, 2, 3, 4, 5}
    B = {3, 4, 5, 6, 7}
    
    print(f"集合 A: {A}")
    print(f"集合 B: {B}")
    print(f"并集 A∪B: {A | B}")
    print(f"交集 A∩B: {A & B}")
    print(f"差集 A-B: {A - B}")
    print(f"对称差集 AΔB: {A ^ B}")
    
    # 函数定义与运算
    x = sp.Symbol('x')
    f = 2*x + 3
    g = x**2 - 1
    
    print(f"\n函数 f(x) = {f}")
    print(f"函数 g(x) = {g}")
    print(f"复合函数 f(g(x)) = {f.subs(x, g)}")
    print(f"复合函数 g(f(x)) = {g.subs(x, f)}")

def exponential_log_functions():
    print("\n=== 指数函数与对数函数 ===")
    
    # 定义x范围
    x = np.linspace(-2, 2, 400)
    
    # 指数函数
    y_exp = 2**x
    y_exp_e = np.exp(x)
    
    # 对数函数
    x_log = np.linspace(0.1, 4, 400)
    y_log2 = np.log2(x_log)
    y_ln = np.log(x_log)
    
    # 绘制图形
    fig, axes = plt.subplots(2, 2, figsize=(12, 10))
    
    # 指数函数
    axes[0, 0].plot(x, y_exp, 'r-', label='y = 2^x')
    axes[0, 0].set_title('指数函数 y = 2^x')
    axes[0, 0].grid(True)
    axes[0, 0].legend()
    
    axes[0, 1].plot(x, y_exp_e, 'b-', label='y = e^x')
    axes[0, 1].set_title('自然指数函数 y = e^x')
    axes[0, 1].grid(True)
    axes[0, 1].legend()
    
    # 对数函数
    axes[1, 0].plot(x_log, y_log2, 'g-', label='y = log₂x')
    axes[1, 0].set_title('对数函数 y = log₂x')
    axes[1, 0].grid(True)
    axes[1, 0].legend()
    
    axes[1, 1].plot(x_log, y_ln, 'm-', label='y = ln x')
    axes[1, 1].set_title('自然对数函数 y = ln x')
    axes[1, 1].grid(True)
    axes[1, 1].legend()
    
    plt.tight_layout()
    plt.show()

sets_and_functions()
exponential_log_functions()